//stack.cpp
#include <iostream>
#include "../testNode/Node.h"
#include "../Array/Array.h"
#ifndef Stackok
#define Stackok

namespace MyStructDate{

template<class TYPE>
class StackL{
    public:
    _List<TYPE> start;
    StackL():start(NULL){}
    StackL(StackL<TYPE> &aa){deepCopy(start,aa.start);}
    ~StackL(){EmptyTable(start);}
    bool pop(TYPE & outinfo);
    bool push(TYPE ininfo);
    bool peek(TYPE & outinfo) const;
    bool isempty(){return start == NULL;}
    void makeempty(){EmptyTable(start);}
    // std::ostream & operator<<(std::ostream & os,StackL<TYPE> &nod);
    inline StackL<TYPE> &operator =(StackL<TYPE> &aa){if(start == aa.start){return *this;}deepCopy(start,aa.start);return *this;}
};

template<class TYPE>
bool StackL<TYPE>::pop(TYPE & outinfo){
    // if(start==NULL){
    //     return false;
    // }
    if(start != NULL){
    outinfo =start->getinfo();
    //_List<TYPE> emp = start;
    start->deleteNode(start);
    return true;}
    return false;
}
template<class TYPE>
bool StackL<TYPE>::push(TYPE ininfo){
    Node<TYPE> *ptr=new Node<TYPE>(ininfo);
    ptr->addHead(start);
    return true;
}
template<class TYPE>
bool StackL<TYPE>::peek(TYPE &outinfo) const{
    if(start==NULL){return false;}
    outinfo = start->getinfo();
    return true;
}



// template<class TYPE>
// class StackA{
//     Array<TYPE> arr;
//     int top;
//     public:
//     StackA():arr(2),top(-1){};
//     bool push(const TYPE pushinfo);
//     bool pop(TYPE &popinfo);
//     bool peek(TYPE &geekinfo);
//     bool isempty(){return top==-1;};
//     void makeempty(){arr.changesize(2); top =-1;}
// };
// template<class TYPE>
// bool StackA<TYPE>::push(const TYPE pushinfo){
//     //len=arr.length();
//     if((top++) >=arr.length()){
//         arr.changesize(top<<1);
//     }
//     arr[top]=pushinfo;
//     return true;
// }
// template<class TYPE>
// bool StackA<TYPE>::pop(TYPE &popinfo){
//     if(top == -1){
//         return false;
//     }
//     popinfo=arr[top];
//     if((top--) <= arr.length()>>2){
//         arr.changesize(arr.length()>>1);
//     }
//     return true;
// }
// template<class TYPE>
// bool StackA<TYPE>::peek(TYPE &popinfo){
//     if(top == -1){
//         return false;
//     }
//     popinfo=arr[top];
//     // if((top--) <= arr.length()>>2){
//     //     try{arr.changesize(top<<1);}
//     //     catch{return false;}
//     // }
//     return true;
// }

// template<class TYPE>
// std::ostream & operator<<(std::ostream & os,StackL<TYPE> &nod){
//     Node<TYPE> *ptr;
//     ptr = nod.start;
//     if(ptr == NULL){
//         os<<"nil\n";
//         return os;
//     }
//     while(ptr!=NULL){
//         os<<ptr->getinfo()<<"\n";
//         ptr = ptr->next;
//     }
//     return os;
// }

}
#endif